/*
    created: 2023/4/9
    filename: linerBystatic.c
    author: 李东霖 
    purpose: 线性表通过静态数组实现定义的实现

*/
#include"linerBystatic.h"


//顺序表的初始化。
void InitList(PSeqList list)
{    
    ClearList(list);
}

//销毁顺序表
void DestroyList(PSeqList list)
{
    ClearList(list);
}

//在顺序表list的第pos个位置插入一个元素elem。-1--elem或者list不存在 1-成功 0-失败
int InsertList(PSeqList list,unsigned int pos,ElemType *elem)
{
    if(NULL == list || NULL == elem) return -1;
    if(MAXSIZE == list->length) return 0;
    if(pos <1 || list->length+1 <pos) return 0;
    //采用mommove
    memmove(list->data+pos,list->data+pos-1,(list->length-pos+1)*sizeof(ElemType));

    // //采用一个一个的移动
    // for(int kk = list->length; kk>pos-1;--kk)
    // {
    //     memcpy(list->data+kk,list->data+kk-1,sizeof(ElemType));
    // }

    memcpy((list->data+pos-1),elem,sizeof(ElemType));
    list->length += 1;
    return 1;
}

//在顺序表list的头结点前插入一个元素elem。-1--elem或者list不存在 1-成功 0-失败
int Push_front(PSeqList list,ElemType *elem)
{
    return InsertList(list,1,elem);
}

//在顺序表list的尾结点后插入一个元素elem。-1--elem或者list不存在 1-成功 0-失败
int Push_back(PSeqList list,ElemType *elem)
{
    if(NULL == list) return -1;
    if(MAXSIZE == list->length) return 0;
    else 
    {
        *(list->data+list->length) = *elem;
        list->length += 1;
    }
    return 1;      
}

//删除顺序表中第pos个位置的元素 返回值：-1-list不存在 1-成功 0-失败
int DeleteElem(PSeqList list, unsigned int pos)
{
    if(NULL == list) return -1;
    if(pos <=0 || list->length <pos) return 0;
    memmove((list->data)+pos-1,(list->data)+pos,(list->length-pos+1)*sizeof(ElemType));
    list->length -= 1;
    return 1;
}

//删除顺序表中的头结点 返回值：-1-list不存在 1-成功 0-失败
int PopFront(PSeqList list)
{
    return DeleteElem(list,1);
}

//删除顺序表中的尾结点 返回值：-1-list不存在 1-成功 0-失败
int PopBack(PSeqList list)
{
    if(NULL == list) return -1;
    if(Is_empty(list)) 
    {   
        return 0;
    }
    else list->length -= 1;
    return 1;
}

//获取线性表第pos位置的元素的值，存放到elem中 -1-list不存在 1-成功 0-失败
int GetElem(PSeqList list,unsigned int pos,ElemType *elem)
{
    if(NULL == list) return -1;
    //越界了
    if(pos <=0 || list->length <pos) return 0;
    *elem=*((list->data)+pos-1);
    return 1;
}

//查找元素elem在顺序表list中的位置 返回值：-1-elem或者list不存在  0-元素elem在表中不存在 >0-位置 
int LocateElem(PSeqList list,const ElemType *elem)
{
    if(NULL == elem || NULL == list) return -1;
    for(int i = 0; i != list->length; ++i)
    {
        if(*elem == *((list->data)+i)) return i+1;
    }
    return 0;
}

//判断是否为空表 -1-不存在，1-为空 0-非空
int Is_empty(PSeqList list)
{
    if(NULL == list) return -1;
    if(0 == list->length) return 1;
    else return 0;
}

//求取线性表长度  -1-线性表不存在 >=-表的元素个数
int ListLength(PSeqList list)
{
    if(NULL == list) return -1;
    return list->length;
}

//输出线性表  
void DispList(PSeqList list)
{
    for(int i = 0; i != list->length; ++i)
    {
        printf("%d  ",*((list->data)+i));
    }
}

//清空线性表  
void ClearList(PSeqList list)
{
    list->length = 0;
    memset(list->data,0,sizeof(ElemType)*MAXSIZE);
}